home *** CD-ROM | disk | FTP | other *** search
/ IRIX Patches 1995 June / SGI IRIX Patches 1995 Jun.iso / 5.3_patches / patchSG0000154 / patchSG0000154.idb / usr / share / src / OpenGL / examples / oss.c.z / oss.c
Encoding:
C/C++ Source or Header  |  1995-06-12  |  6.5 KB  |  224 lines

  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <stdlib.h>
  4. #include "aux.h"
  5. #include <math.h>
  6.  
  7.  
  8. #define WIDTH  512
  9. #define HEIGHT 512
  10.  
  11. static long clearMask = GL_COLOR_BUFFER_BIT;
  12.  
  13. static float light1_spotdir[] = { -2.0, -2.0, 2.0 };
  14. static float light1_spotexp[] = { 4.0 };
  15. static float light1_spotang[] = { 10.0 };
  16. static float light1_ambient[] = { 0.8, 0.2, 0.2, 1.0 };
  17. static float light1_diffuse[] = { 0.2, 0.2, 0.2, 0.0 };
  18. static float light1_position[] = { .0, .0, -1.10, 1.0 };
  19. static float light1_specular[] = { 0.0, 0.0, 0.0, 0.0 };
  20.  
  21. static float light2_spotdir[] = { -2.0, 2.0, 2.0 };
  22. static float light2_spotexp[] = { 4.0 };
  23. static float light2_spotang[] = { 10.0 };
  24. static float light2_ambient[] = { 0.2, 0.8, 0.2, 1.0 };
  25. static float light2_diffuse[] = { 0.2, 0.2, 0.2, 0.0 };
  26. static float light2_position[] = { .0, .0, -1.10, 1.0 };
  27. static float light2_specular[] = { 0.0, 0.0, 0.0, 0.0 };
  28.  
  29. static float light3_spotdir[] = { 2.0, 2.0, 2.0 };
  30. static float light3_spotexp[] = { 4.0 };
  31. static float light3_spotang[] = { 10.0 };
  32. static float light3_ambient[] = { 0.8, 0.2, 0.8, 1.0 };
  33. static float light3_diffuse[] = { 0.2, 0.2, 0.2, 0.0 };
  34. static float light3_position[] = { .0, .0, -1.10, 1.0 };
  35. static float light3_specular[] = { 0.0, 0.0, 0.0, 0.0 };
  36.  
  37. static float light4_spotdir[] = { 2.0, -2.0, 2.0 };
  38. static float light4_spotexp[] = { 4.0 };
  39. static float light4_spotang[] = { 10.0 };
  40. static float light4_ambient[] = { 0.0, 0.0, 0.9, 1.0 };
  41. static float light4_diffuse[] = { 0.2, 0.2, 0.2, 0.0 };
  42. static float light4_position[] = { .0, .0, -1.10, 1.0 };
  43. static float light4_specular[] = { 0.0, 0.0, 0.0, 0.0 };
  44.  
  45. static float face_mat_ambient[] = { 0.2, 0.2, 0.2, 1.0 };
  46. static float face_mat_shininess[] = { 16.0 };
  47. static float face_mat_specular[] = { 1.0, 1.0, 1.0, 0.0 };
  48. static float face_mat_diffuse[] = { 1.0, 0.5, 0.1, 0.0 };
  49.  
  50. static float lmodel_ambient[] = { 1.0, 1.0, 1.0, 1.0 };
  51. static float lmodel_twoside[] = { GL_FALSE };
  52. static float lmodel_local[] = { GL_TRUE };
  53.  
  54. draw_plate(n)
  55. long n;
  56. {
  57.     long i, j;
  58.     float p0[3], p1[3];
  59.     float n1[3];
  60.  
  61.     n1[0] = n1[1] = 0.0; 
  62.     n1[2] = -1.0;
  63.     p0[2] = p1[2] = 0.0;
  64.  
  65.     glNormal3fv(n1);
  66.     for (i = 0; i < n; i++) {
  67.         p0[0] = -1.0 + 2.0*i/n;
  68.         p1[0] = -1.0 + 2.0*(i+1)/n;
  69.         glBegin(GL_QUAD_STRIP);
  70.         for (j = 0; j < n; j++) {
  71.             p0[1] = p1[1] = -1.0 + 2.0*j/n;
  72.             glVertex3fv(p0);
  73.             glVertex3fv(p1);
  74.         }
  75.         glEnd();
  76.     }
  77. }
  78.  
  79. def_light_calc()
  80. {
  81.     glMaterialfv(GL_FRONT, GL_AMBIENT, face_mat_ambient);
  82.     glMaterialfv(GL_FRONT, GL_SHININESS, face_mat_shininess);
  83.     glMaterialfv(GL_FRONT, GL_SPECULAR, face_mat_specular);
  84.     glMaterialfv(GL_FRONT, GL_DIFFUSE, face_mat_diffuse);
  85.  
  86.     glLightModelfv(GL_LIGHT_MODEL_LOCAL_VIEWER, lmodel_local);
  87.     glLightModelfv(GL_LIGHT_MODEL_TWO_SIDE, lmodel_twoside);
  88.     glLightModelfv(GL_LIGHT_MODEL_AMBIENT, lmodel_ambient);
  89.  
  90.     glEnable(GL_LIGHTING);
  91.  
  92.     glLightfv(GL_LIGHT1, GL_AMBIENT, light1_ambient);
  93.     glLightfv(GL_LIGHT1, GL_DIFFUSE, light1_diffuse);
  94.     glLightfv(GL_LIGHT1, GL_SPECULAR, light1_specular);
  95.     glLightfv(GL_LIGHT1, GL_POSITION, light1_position);
  96.  
  97.     glLightfv(GL_LIGHT1, GL_SPOT_DIRECTION, light1_spotdir);
  98.     glLightfv(GL_LIGHT1, GL_SPOT_CUTOFF,    light1_spotang);
  99.     glLightfv(GL_LIGHT1, GL_SPOT_EXPONENT,  light1_spotexp);
  100.     glEnable(GL_LIGHT1);
  101.  
  102.     glLightfv(GL_LIGHT2, GL_AMBIENT, light2_ambient);
  103.     glLightfv(GL_LIGHT2, GL_DIFFUSE, light2_diffuse);
  104.     glLightfv(GL_LIGHT2, GL_SPECULAR, light2_specular);
  105.     glLightfv(GL_LIGHT2, GL_POSITION, light2_position);
  106.  
  107.     glLightfv(GL_LIGHT2, GL_SPOT_DIRECTION, light2_spotdir);
  108.     glLightfv(GL_LIGHT2, GL_SPOT_CUTOFF,    light2_spotang);
  109.     glLightfv(GL_LIGHT2, GL_SPOT_EXPONENT,  light2_spotexp);
  110.     glEnable(GL_LIGHT2);
  111.  
  112.     glLightfv(GL_LIGHT3, GL_AMBIENT, light3_ambient);
  113.     glLightfv(GL_LIGHT3, GL_DIFFUSE, light3_diffuse);
  114.     glLightfv(GL_LIGHT3, GL_SPECULAR, light3_specular);
  115.     glLightfv(GL_LIGHT3, GL_POSITION, light3_position);
  116.  
  117.     glLightfv(GL_LIGHT3, GL_SPOT_DIRECTION, light3_spotdir);
  118.     glLightfv(GL_LIGHT3, GL_SPOT_CUTOFF,    light3_spotang);
  119.     glLightfv(GL_LIGHT3, GL_SPOT_EXPONENT,  light3_spotexp);
  120.     glEnable(GL_LIGHT3);
  121.  
  122.     glLightfv(GL_LIGHT4, GL_AMBIENT, light4_ambient);
  123.     glLightfv(GL_LIGHT4, GL_DIFFUSE, light4_diffuse);
  124.     glLightfv(GL_LIGHT4, GL_SPECULAR, light4_specular);
  125.     glLightfv(GL_LIGHT4, GL_POSITION, light4_position);
  126.  
  127.     glLightfv(GL_LIGHT4, GL_SPOT_DIRECTION, light4_spotdir);
  128.     glLightfv(GL_LIGHT4, GL_SPOT_CUTOFF,    light4_spotang);
  129.     glLightfv(GL_LIGHT4, GL_SPOT_EXPONENT,  light4_spotexp);
  130.     glEnable(GL_LIGHT4);
  131.  
  132.  
  133.  
  134. }
  135.  
  136. #define FUNC(t) (2.0*sin(4.0*t))
  137. #define PI 3.141592654
  138. #define OFF1 (PI/2.0)
  139. #define OFF2 (PI)
  140. #define OFF3 (3.0*PI/2.0)
  141. rotate_lights(float t)
  142. {
  143.     float lightpos[3] = { 0.0, 0.0, 2.0 };
  144.     t /= 150.0;
  145.     /* polar (t, FUNC(t)) */
  146.     /* cartesian (FUNC(t)*cos(t), FUNC(t)*sin(t)) */
  147.     lightpos[0] = FUNC(t)*cos(t);
  148.     lightpos[1] = FUNC(t)*sin(t);
  149.     glLightfv(GL_LIGHT1, GL_SPOT_DIRECTION, lightpos);
  150.     t += OFF1;
  151.     lightpos[0] = FUNC(t)*cos(t);
  152.     lightpos[1] = FUNC(t)*sin(t);
  153.     glLightfv(GL_LIGHT2, GL_SPOT_DIRECTION, lightpos);
  154.     t += OFF1;
  155.     lightpos[0] = FUNC(t)*cos(t);
  156.     lightpos[1] = FUNC(t)*sin(t);
  157.     glLightfv(GL_LIGHT3, GL_SPOT_DIRECTION, lightpos);
  158.     t += OFF1;
  159.     lightpos[0] = FUNC(t)*cos(t);
  160.     lightpos[1] = FUNC(t)*sin(t);
  161.     glLightfv(GL_LIGHT4, GL_SPOT_DIRECTION, lightpos);
  162. }
  163.  
  164. my_display(int resolution)
  165. {
  166.   int i;
  167.    for (i=0;; i++)
  168.    {
  169.         rotate_lights((float)i);
  170.     draw_plate(resolution);
  171.         auxSwapBuffers();
  172.    }
  173. }
  174.  
  175. main(int argc, char **argv)
  176. {
  177.     int i,type;
  178.     short val;
  179.     int resolution = (argc > 1) ? atoi(argv[1]) : 30;
  180.  
  181. #ifdef TK
  182.     strcpy(wind.name, "Spot Test");
  183.     wind.x = 20;
  184.     wind.y = 20;
  185.     wind.width = W;
  186.     wind.height = H;
  187.     wind.type = TK_WIND_REQUEST;
  188.     wind.info = TK_WIND_RGB;
  189.     wind.eventMask = TK_EVENT_EXPOSE | TK_EVENT_KEY | TK_EVENT_CONFIG |
  190.              TK_EVENT_MOUSEUP |  TK_EVENT_DRAW;
  191.     if (tkNewWindow(&wind) == 0) {
  192.     tkQuit();
  193.     }
  194. #endif
  195.  
  196.     auxInitPosition(320, 20, WIDTH, HEIGHT);
  197.  
  198.     type = AUX_DEPTH;
  199.     type |= AUX_RGB;
  200.     type |= AUX_DOUBLE;
  201.     type |= AUX_INDIRECT;
  202.  
  203.     auxInitDisplayMode(type);
  204.  
  205.     if (auxInitWindow("Disco Lights") == GL_FALSE) {
  206.          auxQuit();
  207.     }
  208.  
  209.     glMatrixMode(GL_PROJECTION);
  210.     glLoadIdentity();
  211.     gluPerspective(25.0, (float)WIDTH/(float)HEIGHT, .50, 10.0);
  212.     glMatrixMode(GL_MODELVIEW);
  213.     gluLookAt(0.0,0.0,-5.0,0.0,0.0,0.0,0,1,0);
  214.  
  215.     def_light_calc();
  216.     glClearColor(0.0, 0.0, 0.0, 0.0);
  217.     glClear(clearMask);
  218.     auxSwapBuffers();
  219.     glClearColor(0.0, 0.0, 0.0, 0.0);
  220.     glClear(clearMask);
  221.  
  222.     my_display(resolution);
  223. }
  224.